﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.OleDb;
using System.Linq;
using System.Text;

namespace Controllers
{
    public class RolController
    {
        public static int ObtenerCantidad(string where)
        {
            var sql = "Select count(*) as Cantidad From Superacidos.Rol";

            if (!string.IsNullOrEmpty(where))
            {
                sql += " WHERE " + where;
            }
            var cantidad = 0;
            var reader = ConexionBaseDeDatos.GetData(sql, CommandType.Text);

            if (reader.HasRows)
            {
                reader.Read();
                if (reader["Cantidad"] != DBNull.Value)
                    cantidad = (int)reader["Cantidad"];

            }

            return cantidad;
        }

        public static Rol ObtenerObjeto(OleDbDataReader reader)
        {
            var Rol = new Rol();

            if (reader["Rol_Nombre"] != DBNull.Value)
                Rol.Rol_Nombre = (string)reader["Rol_Nombre"];
            if (reader["Rol_Habilitado"] != DBNull.Value)
                Rol.Rol_Habilitado = (bool)reader["Rol_Habilitado"];
            if (reader["Rol_Id"] != DBNull.Value)
                Rol.Rol_Id = (int)reader["Rol_Id"];

            return Rol;
        }

        public static List<Rol> ObtenerTodos(string where, int pagina, int cantidadRegistros)
        {
            var list = new List<Rol>();

            var sql = "Select TOP " + cantidadRegistros + " * From Superacidos.Rol";

            if (pagina > 1)
            {
                int limiteAnterior = (pagina - 1) * cantidadRegistros;


                var filtrospaginador = !string.IsNullOrEmpty(where)
                                       ? " Rol_Id NOT IN " + "(Select TOP " + limiteAnterior +
                                         " Rol_Id from Superacidos.Rol WHERE " + where +
                                         " ORDER BY Rol_Id) "
                                       : " Rol_Id NOT IN " + "(Select TOP " + limiteAnterior +
                                         " Rol_Id from Superacidos.Rol ORDER BY Rol_Id) ";

                if (!string.IsNullOrEmpty(where))
                {
                    where += " AND ";
                }
                where += filtrospaginador;
            }


            if (!string.IsNullOrEmpty(where))
            {
                sql += " WHERE " + where;
            }

            var reader = ConexionBaseDeDatos.GetData(sql, CommandType.Text);

            if (reader.HasRows)
            {
                while (reader.Read())
                {
                    list.Add(ObtenerObjeto(reader));
                }
            }

            return list;
        }

        public static List<Funcionalidad> ObtenerFuncionalidades(int rolId)
        {
            var sql = "SELECT * ,SUPERACIDOS.funcionalidadhabilitada (" + rolId + ",f.Funcionalidad_id) FuncionalidadHabilitada FROM SUPERACIDOS.funcionalidad f ";

            var listFuncionalidades = new List<Funcionalidad>();
            var reader = ConexionBaseDeDatos.GetData(sql, CommandType.Text);

            if (reader.HasRows)
            {
                while (reader.Read())
                {
                    var Funcionalidad = new Funcionalidad();

                    if (reader["Funcionalidad_Id"] != DBNull.Value)
                        Funcionalidad.Funcionalidad_Id = (int)reader["Funcionalidad_Id"];
                    if (reader["Funcionalidad_Nombre"] != DBNull.Value)
                        Funcionalidad.Funcionalidad_Nombre = (string)reader["Funcionalidad_Nombre"];
                    if (reader["funcionalidadhabilitada"] != DBNull.Value)
                        Funcionalidad.Funcionalidad_Seleccionada = (bool)reader["funcionalidadhabilitada"];

                    listFuncionalidades.Add(Funcionalidad);
                }
            }

            return listFuncionalidades;
        }

        public static void Eliminar(int rolId)
        {
            var conn = ConexionBaseDeDatos.GetConnection();
            var trans = conn.BeginTransaction();

            try
            {

                var sql = "update SUPERACIDOS.rol set rol_habilitado = 0 where rol_Id = " + rolId;
                ConexionBaseDeDatos.Guardar(sql, CommandType.Text, trans);

                sql = "delete from SUPERACIDOS.Usuario_Rol where USRO_RolId = " + rolId;
                ConexionBaseDeDatos.Guardar(sql, CommandType.Text, trans);

                trans.Commit();
            }
            catch(Exception)
            {
                trans.Rollback();
            }
        }


        public static void Agregar(Rol rol, List<Funcionalidad> listaFuncionalidades)
        {
            var conn = ConexionBaseDeDatos.GetConnection();
            var trans = conn.BeginTransaction();

            try
            {
                var id = GetProximoId(trans);
                
                //guardo usuario
                var sql = "insert into SUPERACIDOS.rol (Rol_Nombre,Rol_Habilitado,Rol_Id) values" +
                          "('{0}',{1}, {2})";

                sql = string.Format(sql, rol.Rol_Nombre, rol.Rol_Habilitado ? "1" : "0",id);
                ConexionBaseDeDatos.Guardar(sql, CommandType.Text, trans);

                rol.Rol_Id = id;

                //guardo roles
                GuardarFuncionalidades(listaFuncionalidades, rol, trans);

                trans.Commit();
            }
            catch (Exception)
            {
                trans.Rollback();
            }
        }

        public static void Modificar(Rol rol, List<Funcionalidad> listaFuncionalidades)
        {

            var conn = ConexionBaseDeDatos.GetConnection();
            var trans = conn.BeginTransaction();

            try
            {
                //modifico usuario
                var sql = "update superacidos.rol set rol_nombre = '{0}', rol_habilitado = {1} where rol_id = {2}";
                sql = string.Format(sql, rol.Rol_Nombre, rol.Rol_Habilitado ? "1" : "0", rol.Rol_Id);
                ConexionBaseDeDatos.Guardar(sql, CommandType.Text, trans);

                //boro todas las funcionalidades asignadas
                sql = "delete from superacidos.Rol_Funcionalidad where RoFu_rolId =" + rol.Rol_Id;
                ConexionBaseDeDatos.Guardar(sql, CommandType.Text, trans);

                //asigno los que corresponda
                GuardarFuncionalidades(listaFuncionalidades, rol, trans);

                trans.Commit();
            }
            catch (Exception)
            {
                trans.Rollback();
            }
        }

        private static void GuardarFuncionalidades(List<Funcionalidad> listaFuncionalidades, Rol rol, OleDbTransaction trans)
        {
            var sql = "";
            foreach (var funcionalidad in listaFuncionalidades)
            {
                if (funcionalidad.Funcionalidad_Seleccionada)
                {
                    sql = string.Format("insert into SUPERACIDOS.Rol_Funcionalidad (RoFu_FuncionalidadId,RoFu_RolId) Values ({0},{1})", funcionalidad.Funcionalidad_Id, rol.Rol_Id);
                    ConexionBaseDeDatos.Guardar(sql, CommandType.Text, trans);
                }
            }
        }

        private static int GetProximoId (OleDbTransaction trans)
        {
            var sql = "SELECT superacidos.getrolid() rolid";
            var reader = ConexionBaseDeDatos.GetData(sql, CommandType.Text, trans);
            if (reader.HasRows)
            {
                reader.Read();

                return Convert.ToInt32(reader["rolid"]);
            }
            return 0;
        }
    }
}
